﻿/**
 * Classe d'internationalisation des messages
 * 
 * Permet d'obtenir un message selon la langue par défaut, ou une langue précise.
 * 
 * Utilisation:
 * 
 * I18n.t("nom.du.message") // Chaque point correspondant à une indentation dans le fichier json
 * I18n.t("nom.du.message","lang") 
 * 
 * Pour définir les langues disponibles dans l'application:
 * I18n.setAvailableLangs(["fr","en"])
 * 
 * Pour définir la langue principale
 * I18n.setDefaultLang("fr")
 * 
 * Les messages sont stockés en JSON dans le dossiers locales/lang.json
 * 
 * Si une seule langue est disponible, utilisez le fichier locales/default.json
 */
function I18n()
{
	var _langs = [];
	
	this.oninit = null;
	
	/**
	 * Renvoie le nom du message traduit par une langue
	 * 
	 * @param {String} name le nom du message
	 * @param {Array} args les paramètres du message (optionnel)
	 * @param {String} lang la langue (optionnel)
	 * 
	 * @return {String} le message retourné
	 */
	this.t = function(name, args, lang)
	{
		// Si la langue est pas définie, prise en compte de celle par défaut
		if (!isset(lang))
			lang = I18n.defaultLang;
		
		var res = "";
		
		// S'il y a des indentation, boucle pour aller plus profondément dans l'objet
		if (lang.indexOf("."))
		{
			var names = name.split(".");
			var obj = _langs[lang];
			// Tant qu'on a encore un nom, on continue de descendre
			while (names.length)
				obj = obj[names.shift()];
			// Puis on renvoit l'objet final
			res = obj;
		}
		// Sinon, on envoie le premier niveau
		else
			res = _langs[lang][name]
			
		if (isset(args) && args.length)
			res = res.format(args);
		
		return res;
	};
	
	/**
	 * Méthode d'initialisation de la classe
	 */
	this.init = function()
	{
		I18n.instance = this;
		
		// Si aucune langue est définie, on met en place "default"
		if (I18n.langs.length == 0)
			I18n.langs.push("default");
		
		// Chargement de chaque fichier de langue
		for (var i = 0; i < I18n.langs.length; i++)
		{
			var r = new Request("locales/"+I18n.langs[i]+".json");
			r.onload = _onload;
			r.nameLocale = I18n.langs[i];
			r.start();
		}
	};
	
	/**
	 * Ecouteur déclenché lorsqu'un fichier de langue est chargé
	 * 
	 * @param {RequestEvent} e l'event associé
	 */
	function _onload(e)
	{
		// Si on a un status 0, c'est que le fichier de locale n'a pas été trouvé
		if (e.getStatus() == 0)
			throw(getNewError("{I18n} Impossible to find the locale file '"+e.getRequest().nameLocale+".json' (in folder locales/)"))
		
		// Parsage du JSON
		var json = JSON.parse(e.getRequest().getResponseText())
		_langs[e.getRequest().nameLocale] = json;
	};
}

/**
 * Change les langues disponibles de l'application
 * 
 * @param {Array} arr le tableau des langues disponibles
 */
I18n.setAvailableLangs = function(arr)
{
	I18n.langs = arr;
};

/**
 * Change la langue par défaut
 * 
 * @param {String} lang la langue par défaut
 */
I18n.setDefaultLang = function(lang)
{
	I18n.defaultLang = lang;
};

/**
 * Obtient le message d'une langue précise
 * 
 * Des paramètres peuvent être renseignées (par $1, $2, $3, .. dans la chaîne), puis les valeurs en deuxième argument dans le tableau
 * 
 * La langue peut être aussi choisie
 * 
 * @param {String} message le nom du message à chercher
 * @param {Array} args les valeurs des paramètres (optionnel)
 * @param {String} lang la langue voulue (optionnel)
 */
I18n.t = function(message, args, lang)
{
	return I18n.instance.t(message, args, lang)
};


I18n.defaultLang = "default";
I18n.langs = [];
